package cn.jly.spring.annotation.ioc.config;

import cn.jly.spring.annotation.ioc.bean.Animal;
import cn.jly.spring.annotation.ioc.bean.Person;
import cn.jly.spring.annotation.ioc.config.condition.LinuxCondition;
import cn.jly.spring.annotation.ioc.config.condition.WindowsCondition;
import cn.jly.spring.annotation.ioc.config.importselector.MyImportSelector;
import cn.jly.spring.annotation.ioc.factorybean.ColorFactoryBean;
import org.springframework.context.annotation.*;

/**
 * @author lanyangji
 * @description 配置类2
 * @date 2020/11/12 上午 9:17
 */
//@Configuration
@ComponentScan(basePackages = {"cn.jly.spring.annotation.ioc"})
@Import({/*Color.class, */Animal.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class MainConfig2 {
    /**
     * scope取值：
     * 1. prototype 多实例的 - 在实际使用的时候才创建对象
     * 2. singleton 单例的 - 在ioc容器启动的时候直接创建对象
     * 3. request 同一个请求创建一个对象
     * 4. session 同一个session中创建一个对象
     * <p>
     * lazy懒加载
     */
    @Bean
    @Scope(value = "singleton")
    @Lazy
    public Person person() {
        System.out.println("给容器中添加 person");
        return new Person("张三", 23);
    }

    /**
     * @Conditional 按照条件注册bean
     * <p>
     * 如果系统是windows，则给容器注册bill；如果是linux系统，则注册linux
     */
    @Bean
    @Conditional(value = {WindowsCondition.class})
    public Person person01() {
        return new Person("Bill Gates", 62);
    }

    @Bean
    @Conditional(value = {LinuxCondition.class})
    public Person person02() {
        return new Person("Linux", 48);
    }

    /**
     * 给容器中注册组件
     * 1. 包扫描 + 注解 （@Controller/@Service/@Repository/@Component）
     *      适合自己定义的类
     * 2. @Bean
     *      适合自己定义的类 + 导入的第三方jar
     *  3. @Import
     *      a. @Import，快速给容器中导入一个组件，id默认是全类名
     *      b. ImportSelector，返回需要导入的全类名的数组
     *      c. ImportBeanDefinitionRegistrar
     *  4. factoryBean 工厂bean
     */
    @Bean
    public ColorFactoryBean colorFactoryBean() {
        return new ColorFactoryBean();
    }
}
